# carga los datos de "La Regenta"
load("../textos/Regenta.RData")La Regenta
Análisis de la novela en R
Introducción
El R permite diferentes tipos de análisis de textos.
Dos tipos de texto. De un lado, una novela. De otro, una obra de teatro. Abren la posibilidad de comparar los resultados de los análisis de textos literarios.
Análisis de la novela “La Regenta”
Abrimos los datos
Hacemos un análisis sumario de los capítulos
# carga el paquete quanteda para
# algunos análisis
library(quanteda)
# convierte en un documento corpus
cp <- corpus(regc, text_field = "texto")
# define los capítulos como nombre
# de los documentos
docnames(cp) <- regc$capitulo
# muestra estadísticas básicas de
# cada capítulo
summary(cp)Corpus consisting of 32 documents, showing 32 documents:
Text Types Tokens Sentences parte capitulo
001 - Título 16 16 1 Título 001 - Título
002 - Prólogo 1661 4649 101 Prólogo 002 - Prólogo
01 3753 14662 466 Tomo I 01
02 2236 8029 298 Tomo I 02
03 2194 8395 384 Tomo I 03
04 2448 9121 360 Tomo I 04
05 3104 13640 542 Tomo I 05
06 2312 8171 347 Tomo I 06
07 2194 9012 391 Tomo I 07
08 3178 13095 581 Tomo I 08
09 2832 10992 492 Tomo I 09
10 2096 8184 390 Tomo I 10
11 3026 13356 529 Tomo I 11
12 4169 18985 717 Tomo I 12
13 3611 17074 541 Tomo I 13
14 1980 8172 345 Tomo I 14
15 2869 13484 531 Tomo I 15
16 4022 17978 543 Tomo II 16
17 2190 9804 332 Tomo II 17
18 2793 10446 311 Tomo II 18
19 2947 12333 407 Tomo II 19
20 3753 16462 626 Tomo II 20
21 3681 16554 676 Tomo II 21
22 3256 14615 522 Tomo II 22
23 2087 8302 308 Tomo II 23
24 2031 8248 317 Tomo II 24
25 2343 10096 476 Tomo II 25
26 2812 12811 534 Tomo II 26
27 3122 14099 642 Tomo II 27
28 2889 13290 491 Tomo II 28
29 3532 18228 716 Tomo II 29
30 3724 21083 843 Tomo II 30
Hacemos un análisis de frecuencia de palabras
# convierte en una matriz de términos
dtm <- dfm(tokens(cp, remove_punct = TRUE,
remove_numbers = TRUE,
remove_symbols = TRUE),
tolower = TRUE)
dtm <- dfm_remove(dtm, c(stopwords("es"),"si"))
# muestra las 50 palabras más frecuentes
topfeatures(dtm, 50) don ana usted magistral aquella aquel álvaro víctor
1791 897 822 769 761 733 490 489
casa regenta señor vetusta allí ser después doña
482 468 458 455 450 437 417 414
decía vez mesía podía ahora bien fermín así
414 392 373 369 364 353 350 347
ojos dos iba siempre quería tan menos dijo
347 334 333 332 328 327 327 326
vida mismo hombre dios veces quintanar mundo mujer
324 320 315 310 307 305 290 286
tiempo todas alma ver sabía día parecía amor
283 282 281 280 279 271 267 267
aquello decir
265 259
diccionario
dic <- dictionary(
list(
familia=c("padre", "madre", "hijo", "hija", "hermano", "hermana"),
sociedad=c("vetustense","señor","puebl","ciudad","conversa","amig"),
iglesia=c("cura","obispo","sacerdo","confesión","religi","canónig","capilla"),
economia=c("dinero","deuda","negoci","trabaj","fortuna","rico","rica"),
sentimientos=c("culpa","alegr","amor","remordimiento","ridículo","vergüenza","triste"),
misticismo=c("Fermín de Pas","Fermín","\\bde Pas\\b", "magistral", "espirit","dios"),
adulterio=c("Álvaro Mesía","Álvaro","Mesía","Presidente del Casino", "marido", "placer", "pasión", "amante","amorío"),
espacio=c("casino","catedral","vivero","casa","espolón","teatro"),
tiempo=c("otoño","verano","invierno","primavera","semana santa","navidad")
)
)
library(tenet)
tagCorpus(cp, dic, reshape.to = "sentence")dicf <- dictionary(
list(
familia=c("padre", "madre", "hijo", "hija", "hermano", "hermana"),
sociedad=c("vetustense","señor","puebl","ciudad","conversa","amig")
))
plotLexDiv(cp, dicf, title ="La Regenta", subtitle = "Familia e iglesia en la novela", palette = pal$cat.awtools.spalette.6[1:2])
xy <- countKeywords(cp,
dic,
rel.freq = F,
quietly = TRUE)
# Elimina los términos no encontrados
xy <- xy[xy$frequency>0,]
xy$groups <- NULL
forceDirectedTree(xy,value_col = "frequency",
palette = pal$cat.awtools.bpalette.16,
max.radius = 50,
height = 500)lo mismo se puede ver así:
plotVoronoiTree(data = xy,
value_col = "frequency")dd
dich <- dictionary(
list(
hombres=
list(
Alvaro=c("Álvaro Mesía",
"Álvaro",
"Mesía",
"presidente del casino"),
Saturnino=c("Saturnino Bermúdez",
"Saturnino",
"Bermúdez",
"Saturno",
"Saturnillo"),
Fermin=c("Magistral",
"Provisor",
"Fermín",
"De Pas",
"Fermín de Pas",
"Magistral"),
Victor=c("Víctor",
"Víctor Quintanar",
"Quintanar"),
Otros=c("Custodio",
"Frígilis",
"Anacleto",
"Carlos",
"Orgaz",
"Bismark",
"Celedonio",
"monaguillo",
"Pedro",
"Palomo",
"Cayetano",
"Cayetano Ripamilán",
"Ripamilán",
"Cenceño",
"Pompeyo",
"Pompeyo Guimarán",
"Guimarán",
"Paco",
"Paquito",
"don Santos")
),
mujeres=
list(
Ana=c("Ana",
"Anita",
"Regenta"),
Obdulia=c("Obdulia",
"Obdulia Fandiño",
"Fandiño",
"Obdulita"),
Otras=c("Visitación",
"Petra",
"Camila",
"doña Anuncia",
"Anuncita",
"Águeda",
"doña Paula",
"marquesa",
"doña Petronila")
)
)
)
xp <- countKeywords(cp,
dich,
rel.freq = F,
group.var = "capitulo",
quietly = TRUE)
# Agrega los resultados por los dos niveles
# de código del diccionario
xx <- aggregate(list(frequency=xp$frequency),
by=list(groups=xp$groups,
level1=xp$level2),
sum, na.rm=T)
# Elimina los términos no encontrados
# en el corpus
xx <- xx[xx$frequency>0,]
# Ordena por capítulo
xx <- xx[order(xx$groups),]
plotSankey(xx,
from = "level1",
to="groups",
value = "frequency",
opacity = 0.05)dddd
# Reorganiza el corpus según
# sentencias o frases
cs <- corpus_reshape(cp, "sentences")
# Calcula la frecuencia en la
# que dos codigos del mismo
# diccionario aparecen juntos
# en cada frase
d1 <- matchCodes(cs,
dic,
level = 1,
quietly=TRUE)
# Ordena los resultados de mayor a menor
d1 <- d1[order(d1$value, decreasing = T),]
plotChord(d1,
from = "term1",
to ="term2",
value= "value")Ahora con los personajes
# Reorganiza el corpus según
# sentencias o frases
cs <- corpus_reshape(cp, "sentences")
# Calcula la frecuencia en la
# que dos codigos del mismo
# diccionario aparecen juntos
# en cada frase
d1 <- matchCodes(cs,
dich,
level = 2,
quietly=TRUE)
# Ordena los resultados de mayor a menor
d1 <- d1[order(d1$value, decreasing = T),]
plotChord(d1,
from = "term1",
to ="term2",
value= "value", elementId = "chord2")aaa